package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.EstadoDAO;
import br.com.duosoftware.orcamento.daos.MunicipioDAO;
import br.com.duosoftware.orcamento.daos.OrgaoDAO;
import br.com.duosoftware.orcamento.daos.TipoOrgaoDAO;
import br.com.duosoftware.orcamento.entidades.Contato;
import br.com.duosoftware.orcamento.entidades.Documento;
import br.com.duosoftware.orcamento.entidades.Endereco;
import br.com.duosoftware.orcamento.entidades.Estado;
import br.com.duosoftware.orcamento.entidades.Municipio;
import br.com.duosoftware.orcamento.entidades.Orgao;
import br.com.duosoftware.orcamento.entidades.TipoOrgao;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Daniel
 *
 */
@ManagedBean
@ViewScoped
public class OrgaoBean implements Serializable {

    private Orgao orgao;
    private List<Orgao> orgaos;
    private OrgaoDAO orgaoDAO;
    //    
    ///*******Select Itens*******
    //
    private List<SelectItem> tiposOrgao;
    private List<SelectItem> estados;
    private List<SelectItem> municipios;

    public OrgaoBean() {

        orgaoDAO = new OrgaoDAO();

    }

    public Orgao getOrgao() {
        return orgao;
    }

    public void setOrgao(Orgao orgao) {
        this.orgao = orgao;
    }

    public List<Orgao> getOrgaos() {
        if (orgaos == null) {

            orgaos = orgaoDAO.listarOrgaos();

        }
        return orgaos;
    }

    public void setOrgaos(List<Orgao> orgaos) {
        this.orgaos = orgaos;
    }

    /**
     * <b>Método que inicializa a orgao a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        orgao = new Orgao();
        orgao.setContato(new Contato());
        orgao.setDocumento(new Documento());
        orgao.setEndereco(new Endereco());
        orgao.getEndereco().setMunicipio(new Municipio());
        
    }

    /**
     * <b>Método que adiciona ou edita uma Orgao</b><p>
     *
     * Após o término o método fecha o dialog de cadastro. <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        orgaoDAO.salvarOuAtualizar(orgao);
        orgao = new Orgao();
        orgaos = null;

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgOrgao.hide()");
        requestContext.update("formOrgaos:dtOrgaos");

    }

    /**
     * <b>Método para iniciar o processo de edição de um Orgao.</b> <p>
     *
     * Ele verifica se há um Orgao selecionada para edição, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um Orgao selecionado o médoto abre o dialog para edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (orgao == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgOrgao.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um Orgao.</b> <p>
     *
     * Ele verifica se há uma Orgao selecionado para exclusão, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um Orgao selecionado o médoto abre um p:dialog para confirma
     * ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (orgao == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirOrgao.show()");
        }

    }

    /**
     * <b>Método para excluir um Orgao.</b> <p>
     *
     * Ele verifica se a Orgao selecionado para exclusão está sendo utilizado
     * por alguma outra tabela do banco. Se estiver uma mensagem de aviso é dada
     * ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            orgaoDAO.excluir(orgao);
            orgao = new Orgao();
            orgaos = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirOrgao.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b> <p>
     *
     * O método instancia um novo objeto na variável Orgao para limpar as
     * infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        orgao = new Orgao();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgOrgao.hide()");
        requestContext.update("formOrgao:dtOrgaos");

    }

    ///****Select Itens****
    public List<SelectItem> getTiposOrgao() {

        if (tiposOrgao == null) {

            tiposOrgao = new LinkedList<SelectItem>();

            for (TipoOrgao tipoOrgao : new TipoOrgaoDAO().listarTipoOrgao()) {

                tiposOrgao.add(new SelectItem(tipoOrgao, tipoOrgao.toString()));

            }

        }

        return tiposOrgao;

    }

    public List<SelectItem> getEstados() {

        if (estados == null) {

            estados = new LinkedList<SelectItem>();

            for (Estado estado : new EstadoDAO().listarEstados()) {

                estados.add(new SelectItem(estado, estado.getNome()));

            }

        }

        return estados;

    }

    public List<SelectItem> getMunicipios() {

        if (orgao.getEndereco().getMunicipio().getEstado() != null) {

            municipios = new LinkedList<SelectItem>();

            for (Municipio municio : new MunicipioDAO()
                    .listarComParams(orgao.getEndereco().getMunicipio().getEstado())) {
                
                municipios.add(new SelectItem(municio, municio.getNome()));
                
            }

        }

        return municipios;

    }
    
}
